home *** CD-ROM | disk | FTP | other *** search
- /*-- AutoRev header do NOT edit!
- *
- * Program : AssignPrefs.c
- * Copyright : © 1993 by Digital Dimensions
- * Author : Thomas Frieden
- * Creation Date : 14-Jul-93
- * Current version : 1.02
- * Translator : AztecC
- *
- * REVISION HISTORY
- *
- * Date Version Comment
- * --------- ------- ------------------------------------------
- * 14-Jul-93 0.0 First version
- * 30-Jul-93 0.1 Working editor, to do assigning and icon
- * 31-Jul-93 1.0 Omega version, icon stuff included
- * 31-Jul-93 1.01 Minor bug fixes
- * 31-Jul-93 1.02 Major bug fixes
- *
- *-- REV_END --*/
-
- #include "globals.h"
- #include "gadgets.h"
-
- #define PNAME "AssignPrefs V1.02"
- #define PRINT(x) if (wb) ShowRequest(x,"OK"); else printf("%s\n",x)
-
-
- char version[] = "$VER: AssignPrefs 1.02";
- char defname[256] = "envarc:assignprefs";
- char fname[256];
- char FileName[256];
- char printme[256];
- char Name[256];
- char Path[256];
- char *Types[] = {"Locked", "Path", "Add", "Late"};
- LONG parse[3];
- BYTE AssType = 0;
- BOOL SaveIcons = TRUE, wb = FALSE;
- struct List AssignList;
- struct AssignNode {
- struct Node an_Node;
- char an_Name[256];
- char an_Path[256];
- };
- struct AssignNode *akt, *cnode;
- extern struct DiskObject *def_assign;
- char *NodeName;
-
-
- struct IntuitionBase *IntuitionBase;
- struct GfxBase *GfxBase;
- struct Library *GadToolsBase;
- struct Library *UtilityBase;
- struct Library *AslBase;
- struct Library *DiskfontBase;
- struct Library *IconBase;
-
- void CloseAll() {
-
- CloseMainWindow();
- CloseDownScreen();
- if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
- if (GfxBase) CloseLibrary((struct Library *)GfxBase);
- if (GadToolsBase) CloseLibrary( GadToolsBase);
- if (UtilityBase) CloseLibrary( UtilityBase);
- if (AslBase) CloseLibrary( AslBase);
- if (DiskfontBase) CloseLibrary( DiskfontBase);
- if (IconBase) CloseLibrary( IconBase);
- }
-
-
-
-
- void OpenAll() {
-
- IntuitionBase = (struct IntuitionBase *)
- OpenLibrary((APTR)"intuition.library",37L);
-
- if (!IntuitionBase) {
- printf("Need OS2.0 to run \n");
- CloseAll();
- exit(30);
- }
-
- GfxBase = (struct GfxBase *)
- OpenLibrary((APTR)"graphics.library",0);
- GadToolsBase = OpenLibrary((APTR)"gadtools.library",0);
- UtilityBase = OpenLibrary((APTR)"utility.library",0);
- AslBase = OpenLibrary((APTR)"asl.library",0);
- DiskfontBase = OpenLibrary((APTR)"diskfont.library",0);
- IconBase = OpenLibrary((APTR)"icon.library",0);
- }
-
-
- long ShowRequest(char *text, char *gads) {
- struct EasyStruct es;
- es.es_StructSize=sizeof(struct EasyStruct);
- es.es_Flags=0;
- es.es_Title=(UBYTE *)PNAME " © 1993 Digital Dimensions";
- es.es_TextFormat=(UBYTE *)text;
- es.es_GadgetFormat=(UBYTE *)gads;
- return EasyRequestArgs(NULL,&es,NULL,NULL);
- }
-
-
- BOOL FileRequest(BOOL dironly, BOOL Save) {
-
- struct FileRequester *request;
- BOOL result;
- static char dir[256] = "";
-
- if (!dironly) {
- if (Save)
- request=(struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
- ASL_Hail, "Select file to save... ",
- ASL_Window, MainWnd,
- ASL_FuncFlags, FILF_SAVE,
- ASL_Dir, dir,
- TAG_DONE);
- else
- request=(struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
- ASL_Hail, "Select file to open...",
- ASL_Window, MainWnd,
- ASL_Dir, dir,
- TAG_DONE);
- } else {
- request=(struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
- ASL_Hail, "Select directory to assign...",
- ASL_Window, MainWnd,
- ASL_ExtFlags1, FIL1F_NOFILES,
- ASL_Dir, dir,
- TAG_DONE);
- }
-
- if (request==NULL)
- return(FALSE);
- result = AslRequest(request,NULL);
- if (result==FALSE) {
- FreeAslRequest(request);
- return FALSE;
- }
- strncpy(FileName,(char *)(request->rf_Dir),256);
- strncpy(dir,(char *)(request->rf_Dir),256);
- if (!dironly) AddPart((STRPTR)FileName,request->rf_File,256);
- FreeAslRequest(request);
- return(TRUE);
- }
-
-
- struct AssignNode *NewNode() {
- return(AllocVec(sizeof(struct AssignNode),MEMF_CLEAR|MEMF_PUBLIC));
- }
-
-
- void FreeList() {
-
- struct AssignNode *nnode;
-
- nnode = (struct AssignNode *)1L;
- while (nnode) {
- nnode = (struct AssignNode *)RemHead(&AssignList);
- if (nnode) {
- FreeVec(nnode->an_Node.ln_Name);
- FreeVec(nnode);
- }
- }
- }
-
- void AssList() {
-
- struct AssignNode *nnode;
- BPTR lock;
- char printme[256];
-
- nnode = (struct AssignNode *)1L;
- while (nnode) {
- nnode = (struct AssignNode *)RemHead(&AssignList);
- if (nnode) {
- switch(nnode->an_Node.ln_Pri) {
- case 0: if (lock = Lock((STRPTR)nnode->an_Path, SHARED_LOCK)) {
- if (!(AssignLock((STRPTR)nnode->an_Name,lock))) {
- sprintf(printme,"Error assigning %s", nnode->an_Name);
- PRINT(printme);
- }
- } else {
- sprintf(printme,"Cannot Lock %s",nnode->an_Path);
- PRINT(printme);
- }
- break;
- case 1: if (!(AssignPath((STRPTR)nnode->an_Name,(STRPTR)nnode->an_Path))) {
- sprintf(printme,"Error assigning %s", nnode->an_Name);
- PRINT(printme);
- }
- break;
- case 2: if (lock = Lock((STRPTR)nnode->an_Path, SHARED_LOCK)) {
- if (!(AssignAdd((STRPTR)nnode->an_Name,lock))) {
- sprintf(printme,"Error assigning %s", nnode->an_Name);
- PRINT(printme);
- }
- } else {
- sprintf(printme,"Cannot Lock %s", nnode->an_Path);
- PRINT(printme);
- }
- break;
- case 3: if (!(AssignLate((STRPTR)nnode->an_Name, (STRPTR)nnode->an_Path))) {
- sprintf(printme, "Error assigning %s", nnode->an_Name);
- PRINT(printme);
- }
- break;
- }
- FreeVec(nnode->an_Node.ln_Name);
- FreeVec(nnode);
- }
- }
- }
-
-
- void AddNode(BOOL Update) {
- if (strlen(Name) != 0) {
- if (!cnode) {
- if (strlen(Path)==0) {
- FileRequest(TRUE,FALSE);
- strcpy(Path,FileName);
- }
- akt = NewNode();
- NodeName = AllocVec(80,MEMF_CLEAR|MEMF_PUBLIC);
- sprintf(NodeName,"%20.20s: %-32.32s - %s", Name, Path, Types[AssType]);
- akt->an_Node.ln_Name = NodeName;
- akt->an_Node.ln_Pri = (BYTE)AssType;
- strcpy(akt->an_Name,Name);
- strcpy(akt->an_Path,Path);
- AddTail(&AssignList,(struct Node *)akt);
- if (Update) {
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_List], MainWnd, NULL,
- GTLV_Labels, &AssignList,
- TAG_DONE);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssName], MainWnd, NULL,
- GTST_String, (ULONG)"",
- TAG_DONE);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_Path], MainWnd, NULL,
- GTST_String, (ULONG)"",
- TAG_DONE);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
- GTCY_Active, 0,
- TAG_DONE);
- }
- AssType = 0;
- strcpy(Path,"");
- strcpy(Name,"");
- } else {
- sprintf(cnode->an_Node.ln_Name,
- "%20.20s: %-32.32s - %s", Name, Path,
- Types[AssType]);
- cnode->an_Node.ln_Pri = (BYTE)AssType;
- strcpy(cnode->an_Name,Name);
- strcpy(cnode->an_Path,Path);
- if (Update) {
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_List], MainWnd, NULL,
- GTLV_Labels, &AssignList,
- TAG_DONE);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssName], MainWnd, NULL,
- GTST_String, (ULONG)"",
- TAG_DONE);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_Path], MainWnd, NULL,
- GTST_String, (ULONG)"",
- TAG_DONE);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
- GTCY_Active, 0,
- TAG_DONE);
- }
- AssType = 0;
- strcpy(Path,"");
- strcpy(Name,"");
- cnode=NULL;
- }
- } else {
- ActivateGadget(MainGadgets[GDX_ap_AssName], MainWnd, NULL);
- }
- }
-
- void DelNode() {
-
- if (cnode) {
- Remove((struct Node *)cnode);
- FreeVec(cnode->an_Node.ln_Name);
- FreeVec(cnode);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_List], MainWnd, NULL,
- GTLV_Labels, &AssignList,
- TAG_DONE);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssName], MainWnd, NULL,
- GTST_String, (ULONG)"",
- TAG_DONE);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_Path], MainWnd, NULL,
- GTST_String, (ULONG)"",
- TAG_DONE);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
- GTCY_Active, 0,
- TAG_DONE);
- AssType = 0;
- strcpy(Name,"");
- strcpy(Path,"");
-
- }
- cnode = 0L;
- }
-
- void LoadList(char *name, BOOL show) {
-
- BPTR fh;
- ULONG len;
- LONG Type,*t;
- struct AssignNode *anode;
- char buffer[1024];
- char st[81];
- struct RDArgs *par,*ap;
-
- par = (struct RDArgs *)AllocDosObject(DOS_RDARGS,TAG_DONE);
- if (!par) {
- PRINT("Error in AllocDosObject");
- return;
- }
- fh = Open((STRPTR)name, MODE_OLDFILE);
- if (!fh)
- return;
-
- while (TRUE) {
- if (!(FGets(fh,(STRPTR)&buffer,1024))) break;
- par->RDA_Flags |= RDAF_NOPROMPT;
- par->RDA_Source.CS_Buffer = (UBYTE *)&buffer;
- par->RDA_Source.CS_Length = strlen(buffer);
- par->RDA_Source.CS_CurChr = 0L;
- ap = ReadArgs((STRPTR)"Name/K/A,Path/K/A,Type/N/A",(LONG *)parse,par);
- if (!ap) {
- PRINT("Error in AssignPrefs file. Wrong format!");
- Close(fh);
- FreeList();
- if (show)
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_List], MainWnd, NULL,
- GTLV_Labels, &AssignList,
- TAG_DONE);
- return;
- }
- strcpy(Name,(char *)parse[0]);
- strcpy(Path,(char *)parse[1]);
- t = (LONG *)parse[2];
- Type = *t;
- anode = AllocVec(sizeof(struct AssignNode),MEMF_CLEAR);
- anode->an_Node.ln_Name = AllocVec(90,MEMF_CLEAR);
- strcpy(anode->an_Name,Name);
- strcpy(anode->an_Path,Path);
- anode->an_Node.ln_Pri = (BYTE)Type;
- AddTail(&AssignList,(struct Node *)anode);
- FreeArgs(ap);
- }
-
- Close(fh);
- FreeDosObject(DOS_RDARGS,par);
-
- anode = (struct AssignNode *)AssignList.lh_Head;
- while (anode->an_Node.ln_Succ) {
- sprintf(st,"%20.20s: %-32.32s - %s", anode->an_Name, anode->an_Path,
- Types[anode->an_Node.ln_Pri]);
- strcpy(anode->an_Node.ln_Name,st);
- anode = (struct AssignNode *)anode->an_Node.ln_Succ;
- }
-
- strcpy(Name,"");
- strcpy(Path,"");
- if (show) GT_SetGadgetAttrs(MainGadgets[GDX_ap_List], MainWnd, NULL,
- GTLV_Labels, &AssignList,
- TAG_DONE);
- }
-
-
- void SaveIcon(char *name) {
-
- struct DiskObject *dob;
- BOOL FreeMe = TRUE;
-
- dob = (struct DiskObject *)GetDiskObject((char *)"env:sys/def_assign");
- if (dob == NULL) {
- dob = (struct DiskObject *)&def_assign;
- FreeMe = FALSE;
- }
- if (!(PutDiskObject((STRPTR)name,dob)))
- ShowRequest("Error writing Icon","OK");
- if (FreeMe) FreeDiskObject(dob);
- }
-
-
- void SaveList(char *name) {
-
- BPTR fh;
- ULONG len;
- struct AssignNode *anode;
- char buffer[1024];
-
- fh = Open((STRPTR)name, MODE_NEWFILE);
- anode = (struct AssignNode *)(AssignList.lh_Head);
-
- while (anode->an_Node.ln_Succ) {
- sprintf(buffer,"Name=%s Path=\"%s\" Type=%d\n",anode->an_Name,anode->an_Path,anode->an_Node.ln_Pri);
- len = Write(fh,&buffer,strlen(buffer));
- if (len != strlen(buffer)) {
- ShowRequest("Error writing file","OK");
- Close(fh);
- return;
- }
- anode = (struct AssignNode *)anode->an_Node.ln_Succ;
- }
- Close(fh);
- if (SaveIcons) SaveIcon(name);
- }
-
-
- BOOL ProcessMenu(USHORT Code) {
-
- UWORD mm,ss,ii;
- BOOL running = TRUE;
-
- mm = MENUNUM(Code);
- ii = ITEMNUM(Code);
- ss = SUBNUM(Code);
-
- switch(mm) {
- case 0: switch(ii) {
- case 0: if (!(FileRequest(FALSE,FALSE))) break;
- FreeList();
- LoadList(FileName,TRUE);
- break;
- case 1: if (!(FileRequest(FALSE,FALSE))) break;
- LoadList(FileName,TRUE);
- break;
- case 2: if (!(FileRequest(FALSE,TRUE))) break;
- SaveList(FileName);
- break;
- case 4: ShowRequest("AssignPrefs V1.0\n© 1993 by DIgital DImensions\n"
- "Written by Thomas Frieden\n\nFor bug reports and Questions write to:\n"
- "Thomas Frieden\nSchlossstr. 176\n54293 Trier\n"
- "email: inf02@uni-trier.de","Great, man");
- break;
- case 6: running = FALSE;
- break;
- }
- break;
- case 1: switch(ii) {
- case 0: FreeList();
- LoadList(defname,TRUE);
- break;
- }
- break;
- case 2: switch(ii) {
- case 0: SaveIcons = !SaveIcons;
- break;
- }
- break;
- }
-
- return(running);
- }
-
-
- void main(int argc, char **argv) {
-
- struct IntuiMessage *imsg;
- ULONG Class;
- USHORT Code;
- SHORT Id,i;
- BOOL running = TRUE;
- BOOL use = FALSE;
- BPTR lock,oldlock;
- struct RDArgs *ap;
- struct WBStartup *wbs;
- struct WBArg *wba;
- struct DiskObject *dob;
- UBYTE **ta, *s;
-
-
- if (argc != 0) {
- wb = FALSE;
- ap = ReadArgs((APTR)"FILE,USE/S",parse,NULL);
- if (!ap) {
- FreeArgs(ap);
- PrintFault(IoErr(),NULL);
- CloseAll();
- exit(IoErr());
- } else {
- FreeArgs(ap);
- if (parse[0]) strcpy(fname,(char *)parse[0]);
- if (parse[1]) use = TRUE;
- }
- }
-
- if (use) {
- if (strlen(fname) == 0)
- strcpy(fname,defname);
- NewList(&AssignList);
- LoadList(fname,FALSE);
- AssList();
- CloseAll();
- exit(0);
- }
-
- OpenAll();
-
- if (argc == 0) {
- wb = TRUE;
- wbs = (struct WBStartup *)argv;
- wba = wbs->sm_ArgList;
- if (wbs->sm_NumArgs > 1) {
- NameFromLock(wba[1].wa_Lock,(STRPTR)fname,256);
- AddPart((STRPTR)fname,(STRPTR)wba[1].wa_Name,256);
- oldlock = CurrentDir(wba[1].wa_Lock);
- dob = (struct DiskObject *)GetDiskObject(wba[1].wa_Name);
- CurrentDir(oldlock);
- if (dob) {
- if (dob->do_ToolTypes) {
- ta = (UBYTE **)dob->do_ToolTypes;
- if (s = (UBYTE *)FindToolType((char **)ta,"ACTION")) {
- if (MatchToolValue(s,(UBYTE *)"USE")) use = TRUE;
- if (MatchToolValue(s,(UBYTE *)"use")) use = TRUE;
- if (MatchToolValue(s,(UBYTE *)"POPUP")) use = FALSE;
- if (MatchToolValue(s,(UBYTE *)"popup")) use = FALSE;
- }
- }
- }
- } else {
- oldlock = CurrentDir(wba->wa_Lock);
- dob = (struct DiskObject *)GetDiskObject(wba->wa_Name);
- CurrentDir(oldlock);
- if (dob) {
- if (dob->do_ToolTypes) {
- ta = (UBYTE **)dob->do_ToolTypes;
- if (s = (UBYTE *)FindToolType((char **)ta,"ACTION")) {
- if (MatchToolValue(s,(UBYTE *)"USE")) use = TRUE;
- if (MatchToolValue(s,(UBYTE *)"use")) use = TRUE;
- if (MatchToolValue(s,(UBYTE *)"POPUP")) use = FALSE;
- if (MatchToolValue(s,(UBYTE *)"popup")) use = FALSE;
- }
- if (s = (UBYTE *)FindToolType((char **)ta,"FILE")) strcpy(defname, (char *)s);
- }
- FreeDiskObject(dob);
- };
- }
- }
-
- if (strlen(fname) == 0)
- strcpy(fname,defname);
-
- if (use) {
- NewList(&AssignList);
- LoadList(fname,FALSE);
- AssList();
- CloseAll();
- exit(0);
- }
-
- SetupScreen();
- OpenMainWindow();
-
- NewList(&AssignList);
- cnode = NULL;
-
- LoadList(fname,TRUE);
-
- while(running) {
- WaitPort(MainWnd->UserPort);
- while(imsg = GT_GetIMsg(MainWnd->UserPort)) {
- Class = imsg->Class;
- Code = imsg->Code;
- if (Class == IDCMP_GADGETUP || Class == IDCMP_GADGETDOWN)
- Id = ((struct Gadget *)(imsg->IAddress))->GadgetID;
- GT_ReplyIMsg(imsg);
- switch(Class) {
- case IDCMP_MENUPICK:
- running = ProcessMenu(Code);
- break;
- case IDCMP_VANILLAKEY:
- switch(Code) {
- case 'a':
- case 'A':
- AddNode(TRUE);
- break;
- case 'q':
- case 'Q':
- running = FALSE;
- break;
- case 'n':
- case 'N':
- ActivateGadget(MainGadgets[GDX_ap_AssName], MainWnd, NULL);
- break;
- case 'p':
- case 'P':
- ActivateGadget(MainGadgets[GDX_ap_Path], MainWnd, NULL);
- break;
- case 't':
- AssType++;
- AssType = AssType & 3;
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
- GTCY_Active, AssType,
- TAG_DONE);
- break;
- case 'T':
- AssType--;
- AssType = AssType & 3;
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
- GTCY_Active, AssType,
- TAG_DONE);
- break;
-
- case 'd':
- case 'D':
- DelNode();
- break;
- case 's':
- case 'S':
- SaveList(defname);
- break;
- }
- break;
- case IDCMP_REFRESHWINDOW:
- GT_BeginRefresh(MainWnd);
- GT_EndRefresh(MainWnd,TRUE);
- break;
- case IDCMP_GADGETUP:
- switch(Id) {
- case GD_ap_Cancel:
- running = FALSE;
- break;
- case GD_ap_AssName:
- strcpy(Name, (char *)GetString(MainGadgets[GDX_ap_AssName]));
- ActivateGadget(MainGadgets[GDX_ap_Path],MainWnd,NULL);
- break;
- case GD_ap_Path:
- strcpy(Path, (char *)GetString(MainGadgets[GDX_ap_Path]));
- if (strlen(Path)==0) {
- if (FileRequest(TRUE,FALSE)) {
- strcpy(Path,FileName);
- if (strlen(Path) == 0) {
- lock = Lock((STRPTR)"Ram:",SHARED_LOCK);
- oldlock = CurrentDir(lock);
- NameFromLock(oldlock,(STRPTR)Path,256);
- CurrentDir(oldlock);
- UnLock(lock);
- }
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_Path], MainWnd, NULL,
- GTST_String, Path,
- TAG_DONE);
- }
- }
- break;
- case GD_ap_AssType:
- AssType = Code;
- break;
- case GD_ap_List:
- cnode = (struct AssignNode *)AssignList.lh_Head;
- for (i=0;i<Code;i++)
- cnode=(struct AssignNode *)cnode->an_Node.ln_Succ;
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssName], MainWnd, NULL,
- GTST_String, (ULONG)cnode->an_Name,
- TAG_DONE);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_Path], MainWnd, NULL,
- GTST_String, (ULONG)cnode->an_Path,
- TAG_DONE);
- GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
- GTCY_Active, (ULONG)cnode->an_Node.ln_Pri,
- TAG_DONE);
- strcpy(Name, cnode->an_Name);
- strcpy(Path, cnode->an_Path);
- AssType = cnode->an_Node.ln_Pri;
- break;
- case GD_ap_Add:
- AddNode(TRUE);
- break;
- case GD_ap_Del:
- DelNode();
- break;
- case GD_ap_Save:
- SaveList(defname);
- break;
- }
- break;
- }
- }
- }
- FreeList();
- CloseAll();
- exit(0);
- }
-
-
-
-
-